package com.haohan.jingyuan.common.validation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Method;

/**
 * 枚举值校验器
 *
 * @ClassName EnumValidator
 * @Description 校验字段值是否在指定枚举类中定义，支持String和Integer类型
 * @Author hexijun
 * @Time 2025/01/19 11:10
 * @Version 1.0
 */
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {

    private Class<? extends Enum<?>> enumClass;

    @Override
    public void initialize(EnumValid constraintAnnotation) {
        this.enumClass = constraintAnnotation.enumClass();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        // 如果值为null，返回true（由@NotNull或@NotBlank处理空值校验）
        if (value == null) {
            return true;
        }
        
        try {
            // 根据值的类型，尝试调用枚举类的getByCode方法
            Method getByCodeMethod;
            if (value instanceof Integer) {
                getByCodeMethod = enumClass.getMethod("getByCode", Integer.class);
            } else {
                getByCodeMethod = enumClass.getMethod("getByCode", String.class);
            }
            Object result = getByCodeMethod.invoke(null, value);
            return result != null;
        } catch (Exception e) {
            // 如果枚举类没有getByCode方法，则尝试通过枚举值名称匹配
            try {
                Enum<?>[] enumConstants = enumClass.getEnumConstants();
                for (Enum<?> enumConstant : enumConstants) {
                    // 尝试调用getCode方法
                    Method getCodeMethod = enumConstant.getClass().getMethod("getCode");
                    Object code = getCodeMethod.invoke(enumConstant);
                    if (value instanceof Integer && code instanceof Integer) {
                        if (value.equals(code)) {
                            return true;
                        }
                    } else {
                        if (String.valueOf(value).equals(String.valueOf(code))) {
                            return true;
                        }
                    }
                }
            } catch (Exception ex) {
                // 如果都没有相应方法，返回false
                return false;
            }
        }
        
        return false;
    }
}
